То, что MFC умеет работать с помощью, вызвать ее это хорошо. Но что делать, если нам самим нужно вызвать эту команду да еще со своими параметрами. Можно воспользоваться функцией WinHelp API, в тоже время класс CWnd имеет такую же функцию.
CWinApp::WinHelp virtual void WinHelp ( DWORD dwData, // данные UINT nCmd = HELP_CONTEXT // команда );
Как видите она намного проще. Во-первых не надо указывать какое приложение вызывает справку, плюс к этому вообще и файл справки указывать не надо, так как MFC помнит файл, который она создала. Для того, чтобы воспользоваться этой функцией самому нужно первое это описать константы разделов, которые будут вызываться.
// MainFrm.cpp : implementation of the CMainFrame class // ...... #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define HIDD_DIALOG1 0x20082 /////////////////////////// ......
И вызвать саму функцию в ответ на какое-то событие.
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnViewDialog()
{
WinHelp(HIDD_DIALOG1);
}
Откуда MFC знает имя ? Оно хранится в классе CWinApp. Этот код выдаст Вам имя справки.
void CMainFrame::OnViewDialog()
{
AfxMessageBox(AfxGetApp()->m_pszHelpFilePath);
}
Откуда оно берется ? Определяется во время инициализации WinApp, вычисляется исходя из имени модуля.
void CWinApp::SetCurrentHandles()
{
......
TCHAR szBuff[_MAX_PATH];
VERIFY(::GetModuleFileName(m_hInstance, szBuff, _MAX_PATH));
......
if (m_pszHelpFilePath == NULL)
{
lstrcpy(lpszExt, _T(".HLP"));
BOOL bEnable = AfxEnableMemoryTracking(FALSE);
m_pszHelpFilePath = _tcsdup(szBuff);
AfxEnableMemoryTracking(bEnable);
*lpszExt = '\0'; // back to no suffix
}
......
}
При необходимости смены этого имени сначала память выделенную под строку нужно удалить, потом присвоить значение этой строке:
free((void*)m_pszHelpFilePath
m_pszHelpFilePath=_tcsdup(_T("d:\\somedir\\myhelp.hlp"));